home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / crt / sun4.md / gstart.s < prev    next >
Text File  |  1991-11-11  |  3KB  |  85 lines

  1. /*
  2.  * gstart.s --
  3.  *
  4.  *    Profiling crt0 for sun4.  This is the header that sets up argc,
  5.  *      argv and envp for main() and then jumps there.  It also initializes
  6.  *      the values of certain registers.  The profiling routines are
  7.  *      initialized.
  8.  *
  9.  * Copyright 1989 Regents of the University of California
  10.  * Permission to use, copy, modify, and distribute this
  11.  * software and its documentation for any purpose and without
  12.  * fee is hereby granted, provided that the above copyright
  13.  * notice appear in all copies.  The University of California
  14.  * makes no representations about the suitability of this
  15.  * software for any purpose.  It is provided "as is" without
  16.  * express or implied warranty.
  17.  */
  18.  
  19. #include <kernel/machConst.h>
  20. .seg    "data"
  21. .asciz    "$Header: /sprite/src/lib/c/crt/sun4.md/RCS/gstart.s,v 1.2 91/11/11 15:56:50 jhh Exp $"
  22.  
  23. .align    8
  24. .seg    "text"
  25.  
  26. .globl    gstart
  27.  
  28. /*
  29.  * The stack pointer should be double-word aligned when it gets here.  At
  30.  * MACH_FULL_STACK_FRAME beneath it lies the user stack put together in
  31.  * DoExec().  At the top of this is the argc integer.  Below that is the argv
  32.  * stuff and below that is the
  33.  * environment stuff.
  34.  */
  35. gstart:
  36.     /* Mark last stack frame so debugger can tell bottom of stack. */
  37.     clr    %fp
  38.  
  39. /*----------------------------------------------------------------------*/
  40.  
  41.         /*
  42.      *  Special stuff for dealing with profiling.  Except for this
  43.      *  stuff, this file is the same as start.s
  44.      */
  45.  
  46.     sethi   %hi(0x2000), %o0        /* 0x2000 = start of text segment   */
  47.         sethi   %hi(_etext), %o1
  48.     call    _monstartup             /* monstartup(etext, 0x2000)        */
  49.     or      %lo(_etext), %o1, %o1
  50.  
  51.         sethi   %hi(__mcleanup), %o0
  52.     call    _atexit                         /* atexit(_mcleanup) */
  53.     or      %lo(__mcleanup), %o0, %o0
  54.  
  55.     sethi   %hi(_errno),%o0
  56.     st    %g0,[%o0+%lo(_errno)]           /* errno = 0 */
  57.  
  58. /*----------------------------------------------------------------------*/
  59.  
  60.     /*
  61.      * Argc is the first word on the top of the stack (top == lowest addr).
  62.      * This is followed immediately by the array of pointers to arguments
  63.      * (argv) and this is followed immediately by the array of pointers to
  64.      * the environment (envp).  We must calculate the address of envp by
  65.      * using the number of arguments given in argc.
  66.      * environ = (char *) argv + (argc + 1) * 4.
  67.      * And argv = top of stack plus sizeof (Address).
  68.      */
  69.     mov    %sp, %VOL_TEMP1
  70.     add    %VOL_TEMP1, MACH_FULL_STACK_FRAME, %VOL_TEMP1
  71.     ld    [%VOL_TEMP1], %o0        /* argc */
  72.     add    %VOL_TEMP1, 4, %o1        /* argv pointer */
  73.     add    %o0, 1, %o2
  74.     sll    %o2, 2, %o2
  75.     add    %o2, %o1, %o2        /* envp pointer */
  76.     set    _environ, %o3
  77.     st    %o2, [%o3]        /* store addr of env into environ */
  78.  
  79.     /* Off to main routine with arguments argc, argv, envp */
  80.     call    _main, 3
  81.     nop
  82.     call    _exit
  83.     nop
  84.  
  85.